# -*- coding:utf-8 -*-
# title           :
# description     :
# author          :Python超人/三月三提供
# date            :2024-07-15
# link            :https://gitcode.net/pythoncr/
# python_version  :3.9
# ==============================================================================

from 神笔码靓.神笔库.神笔绘图板 import 神笔绘图板
from 神笔码靓.神笔库.定义集 import *
from 神笔码靓.神笔库.配置 import *
from 神笔码靓.神笔库.通用工具集 import *


class 纸笔五子棋(神笔绘图板):
    def __init__(self, 文件路径, 棋盘背景色=None, 棋盘格颜色=None, 棋盘行列数=14):
        宽, 高 = 纸张大小.A4_纵向(1)
        super(纸笔五子棋, self).__init__(作品文件路径=文件路径, 宽=宽, 高=高)
        self.左边距, self.右边距 = 60, 60
        self.上边距, self.下边距 = 70, 60
        self.X间距 = 50
        self.Y间距 = 35
        self.外框边距 = 3
        self.棋盘行列数 = 棋盘行列数
        self.白子图片 = None
        self.黑子图片 = None
        # self.显示图框()
        # if 棋盘背景色 is not None:
        #     self.设置背景色(棋盘背景色)
        # self.设置背景色("#EEBC73")
        self.棋盘背景色 = 颜色.透明 if 棋盘背景色 is None else 棋盘背景色
        self.棋盘格颜色 = 颜色.黑色 if 棋盘格颜色 is None else 棋盘格颜色
        self.格宽 = (self.宽 - self.右边距 - self.左边距 - self.X间距) / (self.棋盘行列数 * 2)

    def 写说明文字(self):
        文字位置Y = self.上边距 - 20
        self.写字(x=self.宽 / 2, y=文字位置Y, 文字="随身五子棋", 填充颜色="#666666",
                字体=系统字体.隶书, 字体大小=30)  # .阴影(偏移=(1, 1), 模糊度=1)
        self.写网址信息(x=self.宽 - self.右边距, y=文字位置Y, 字体大小=12, 水平基线对齐=文字水平基线对齐.结束点对齐)
        self.写软件信息(x=self.左边距, y=文字位置Y, 字体大小=28, 填充颜色=颜色.深灰色,
                   水平基线对齐=文字水平基线对齐.起始点对齐, 是否转路径=是)

        if self.棋盘格颜色 == 颜色.黑色:
            印章颜色 = 颜色.黑色
        else:
            印章颜色 = None

        self.作者印章(印章颜色, 是否转路径=是).平移(self.左边距 + 115, self.上边距 - 45).缩放(0.1).透明度(0.3)

    def 画棋盘(self):
        格宽 = self.格宽
        棋盘宽 = 格宽 * self.棋盘行列数
        for yi in range(3):
            y = self.上边距 + yi * (棋盘宽 + self.Y间距)
            中间y = y + 棋盘宽 / 2
            # y = y + 格宽 * (self.棋盘行列数 / 2 + 0.5)
            # ⚪🗙 或者 ⚫⚪
            # self.写字(x=self.宽 / 2, y=y + 格宽 * (self.棋盘行列数 / 2 + 0.5), 文字=f"⚪🗙{全角空格 * 5}⚫⚪",
            #         字体大小=10, 字体=系统字体.TimesNewRoman).旋转(90).字旋转(-90).平移(0, 3)
            # self.文字转路径(x=self.宽 / 2, y=y + 格宽 * (self.棋盘行列数 / 2 + 0.5), 文字=f"⚪🗙{全角空格 * 5}⚫⚪",
            #         字体大小=10, 字体文件="安卓字体.ttf")
            # self.画圆(x=self.宽 / 2, y=y, 半径=6)
            self.符号.圆(中心点=(self.宽 / 2, 中间y - 36), 半径=6)
            self.符号.叉(中心点=(self.宽 / 2, 中间y - 18), 线长=12)
            self.画圆(x=self.宽 / 2, y=中间y + 18, 半径=6, 填充颜色=颜色.黑色)
            self.画圆(x=self.宽 / 2, y=中间y + 36, 半径=6)

            for xi in range(2):
                x = self.左边距 + xi * (格宽 * self.棋盘行列数 + self.X间距)
                # 棋盘外框
                外框边长 = 格宽 * self.棋盘行列数 + self.外框边距 * 2
                self.画矩形(x=x - self.外框边距, y=y - self.外框边距, 宽=外框边长, 高=外框边长,
                         描边宽度=1.5, 描边颜色=self.棋盘格颜色, 填充颜色=self.棋盘背景色)
                # 棋盘
                self.画表格(x=x, y=y, 列宽=格宽, 列数=self.棋盘行列数, 行高=格宽, 行数=self.棋盘行列数,
                         描边宽度=0.5, 描边颜色=self.棋盘格颜色)

                for px in [3, self.棋盘行列数 - 3]:
                    for py in [3, self.棋盘行列数 - 3]:
                        cx = x + px * 格宽
                        cy = y + py * 格宽
                        # 定位点
                        self.画圆(x=cx, y=cy, 半径=1.5, 填充颜色=self.棋盘格颜色, 描边颜色=self.棋盘格颜色)

    def 落子序号重置(self):
        if hasattr(self, "落子序号"):
            delattr(self, "落子序号")

    def 落子(self, 棋子, 行, 列, 说明=None, 记录序号=否, 棋盘=(0, 1), 开始序号=1, 最后落子=False, 显示阴影=False):
        # 黑, 白 = "⚫", "⚪"
        棋子字典 = {"黑": "⚫", "白": "⚪"}
        # 特别说明：棋局由15行15列组成，其中的行由1-15表示，列由A-O标识
        if isinstance(列, str):
            列号 = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".index(列) + 1
            列号 = self.棋盘行列数 + 2 - 列号
        else:
            列号 = 列
        行号 = self.棋盘行列数 + 2 - 行
        if not 0 < 行号 <= self.棋盘行列数 + 1 or not 0 < 列号 <= self.棋盘行列数 + 1:
            return
        棋盘x, 棋盘y = 棋盘
        格宽 = self.格宽
        上y = self.上边距 + 棋盘y * (格宽 * self.棋盘行列数 + self.Y间距)
        左x = self.左边距 + 棋盘x * (格宽 * self.棋盘行列数 + self.X间距)
        x = 左x + (列号 - 1) * 格宽
        y = 上y + (行号 - 1) * 格宽
        棋子缩放 = 1.5

        if (棋子 == "黑" and self.黑子图片 is None) or (棋子 == "白" and self.白子图片 is None):
            self.写字(x=x, y=y, 文字=棋子字典[棋子], 字体大小=10 * 棋子缩放, id_=f"落子_{棋子}_{行}_{列}")
        else:
            棋子大小 = round(格宽 * 0.85, 2)
            if 棋子 == "黑":
                if not hasattr(self, "黑子图片模板"):
                    图片 = self.贴图(x=0, y=0, 宽=棋子大小, 高=棋子大小, 图片文件=self.黑子图片)
                    self.黑子图片模板 = self.创建模板(元素列表=[图片])
                棋子图片 = self.黑子图片模板.创造元素()
            else:
                if not hasattr(self, "白子图片模板"):
                    图片 = self.贴图(x=0, y=0, 宽=棋子大小, 高=棋子大小, 图片文件=self.白子图片)
                    self.白子图片模板 = self.创建模板(元素列表=[图片])
                棋子图片 = self.白子图片模板.创造元素()

            棋子图片.平移(x - 棋子大小 / 2, y - 棋子大小 / 2)
            if 显示阴影:
                棋子图片.阴影(偏移=(1, 1), 模糊度=0.5)

        if 记录序号:
            if not hasattr(self, "落子序号"):
                setattr(self, "落子序号", 开始序号 - 1)

            落子序号 = getattr(self, "落子序号")
            落子序号 += 1
            setattr(self, "落子序号", 落子序号)
            if 落子序号 > 99:
                字体大小 = 5.5 * 棋子缩放
            else:
                字体大小 = 6.5 * 棋子缩放
            if 最后落子:
                填充颜色 = 颜色.红色
            elif 棋子 == "黑":
                填充颜色 = 颜色.白色
            else:
                填充颜色 = 颜色.黑色
            self.写字(x=x, y=y + 1, 文字=落子序号, 字体大小=字体大小, 填充颜色=填充颜色, id_=f"落子序号_{棋子}_{行}_{列}")

    def 棋局转换(self, 棋局):
        # 以下是一个简单的五子棋棋局步法示例：
        # 黑 1：h8（黑方落子在棋盘天元位置）
        # 白 2：i9（白方在黑方上方落子）
        # 黑 3：j8（黑方在白方左边落子）
        # 白 4：k9（白方继续向右上方落子）
        # 黑 5：l8（黑方向左延伸落子）
        # 白 6：m9（白方阻挡黑方）
        # 黑 7：n8（黑方拓展棋局）
        # 白 8：o9（白方防守）
        # 黑 9：h7（黑方改变方向落子）
        # 白 10：i7（白方应对）
        # 黑 11：j7（黑方试图连接）
        # 白 12：k7（白方截断）
        # 黑 13：l7（黑方持续进攻）
        # 白 14：m7（白方坚守）
        # 黑 15：n7（黑方形成一定优势）
        棋盘行号 = "ABCDEFGHIJKLMNO"
        if isinstance(棋局, str):
            棋局 = 棋局.split("\n")
        开始步数 = 0
        棋局列表 = []
        for 步 in 棋局:
            if 步 is None:
                continue
            if len(步.strip()) == 0:
                continue
            步 = 步.replace("（", "(").replace("）", ")").replace(")", "")
            说明 = ""
            if "(" in 步:
                步, 说明 = 步.split("(")

            步 = 步.replace("：", ":")
            if ":" in 步:
                棋子颜色, 落子位置 = 步.split(":")
                棋子颜色 = 棋子颜色.replace(" ", "")
                if len(棋子颜色) > 1:
                    棋子颜色, 步数 = 棋子颜色[0], 棋子颜色[1:]
                    if 开始步数 == 0:
                        开始步数 = int(步数)
                落子位置 = str(落子位置).upper()
                列在前 = 落子位置[0] in 棋盘行号

                for i, 字母 in enumerate(棋盘行号):
                    落子位置 = 落子位置.replace(字母, f",{i + 1},")
                落子位置 = 落子位置.strip(",")

                a1, a2 = 落子位置.split(",")
                if not 列在前:
                    a2, a1 = a1, a2

                棋局列表.append((棋子颜色, int(a1), int(a2), 说明))

        if 开始步数 == 0:
            开始步数 = 1

        return 棋局列表, 开始步数

    def 画对局(self, 棋局=None, 记录序号=否, 棋盘=(0, 0), 显示阴影=否):
        开始步数 = 1
        self.落子序号重置()
        if 棋局 is None:
            棋局 = [
                ("黑", 7, 7), ("白", 7, 6),
                ("黑", 6, 7), ("白", 6, 6),
                ("黑", 5, 7), ("白", 4, 7),
                ("黑", 8, 7), ("白", 9, 7),
            ]
        elif isinstance(棋局, str):
            棋局, 开始步数 = self.棋局转换(棋局)
        elif isinstance(棋局, list):
            if ":" in 棋局[0]:
                棋局, 开始步数 = self.棋局转换(棋局)
        # else:
        #     棋局 = self.棋局转换(棋局)

        棋盘x, 棋盘y = 棋盘
        for i, (棋子, 列, 行, *说明) in enumerate(棋局):
            if len(说明) == 0:
                说明 = ""
            else:
                说明 = 说明[0]

            self.落子(棋子=棋子, 行=行, 列=列, 说明=说明, 记录序号=记录序号, 棋盘=(棋盘x, 棋盘y),
                    开始序号=开始步数, 最后落子=i >= (len(棋局) - 1), 显示阴影=显示阴影)

    def 页面设置(self, 设置: 纸张设置):
        # 输出 PDF 文件，以及 页面打印，在这里设置好
        设置.上页边距 = "0.2cm"
        设置.下页边距 = 0
        设置.左页边距 = "0.1cm"
        设置.右页边距 = 0
        设置.页面缩放 = 1.02

    def 创作(self):
        self.画棋盘()
        self.写说明文字()
